Choosing
Help with the Mouse
An
application can enable the user to choose a help topic with the mouse by
intercepting mouse input messages and calling the WinHelp function. To distinguish
requests to view help from regular mouse input, the user must press the SHIFT+F1 key
combination. In such cases, the application sets a global variable when the
user presses the key combination and changes the cursor shape to a question-mark
pointer to indicate that the mouse can be used to choose a help topic.
To detect the
SHIFT+F1 key combination, an application checks for the VK_F1 virtual-key value
in each WM_KEYDOWN
message sent to its main window procedure. It also checks for the VK_ESCAPE
virtual-key code. The user presses the ESC key to quit Windows Help and restore the mouse to its
regular function. The following example checks for these keys:
case WM_KEYDOWN:
if (wParam == VK_F1) {
/* If Shift-F1, turn help mode on
and set help cursor. */
if (GetKeyState(VK_SHIFT)) {
bHelp = TRUE;
SetCursor(hHelpCursor);
return DefWindowProc(hwnd,
message, wParam, lParam);
}
/* If F1 without shift, call help
main index topic. */
else {
WinHelp(hwnd,"myhelp.hlp",HELP_CONTENTS,0L);
}
}
else if
(wParam == VK_ESCAPE && bHelp) {
/* Escape during help mode: turn
help mode off. */
bHelp = FALSE;
SetCursor((HCURSOR)
GetClassWord(hWnd, GCW_HCURSOR));
}
break;
Until the
user clicks the mouse or presses the ESC key, the application responds to WM_SETCURSOR
messages by resetting the cursor to the arrow and question-mark combination.
case WM_SETCURSOR:
/*
* In help mode, it is necessary to
reset the cursor in response
* to every WM_SETCURSOR message.
Otherwise, by default, Windows
* will reset the cursor to that of
the window class.
*/
if (bHelp) {
SetCursor(hHelpCursor);
break;
}
return (DefWindowProc(hwnd, message,
wParam, lParam));
case WM_INITMENU:
if (bHelp) {
SetCursor(hHelpCursor);
}
return (TRUE);
If the user
clicks the mouse button in a nonclient area of the application window while in
help mode, the application receives a WM_NCLBUTTONDOWN
case WM_NCLBUTTONDOWN:
/*
* If in help mode (Shift+F1), display context-sensitive
* help for nonclient area.
*/
if (bHelp)
{
dwHelpContextId =
(wParam == HTCAPTION) ?(DWORD)
HELPID_TITLE_BAR:
(wParam == HTSIZE) ? (DWORD)
HELPID_SIZE_BOX:
(wParam == HTREDUCE) ?
(DWORD) HELPID_MINIMIZE_ICON:
(wParam == HTZOOM) ? (DWORD)
HELPID_MAXIMIZE_ICON:
(wParam == HTSYSMENU)
?(DWORD) HELPID_SYSTEM_MENU:
(wParam == HTBOTTOM) ?
(DWORD) HELPID_SIZING_BORDER:
(wParam == HTBOTTOMLEFT) ?
(DWORD) HELPID_SIZING_BORDER:
(wParam == HTBOTTOMRIGHT)
?(DWORD) HELPID_SIZING_BORDER:
(wParam == HTTOP) ?(DWORD)
HELPID_SIZING_BORDER:
(wParam == HTLEFT) ?(DWORD)
HELPID_SIZING_BORDER:
(wParam == HTRIGHT) ?(DWORD)
HELPID_SIZING_BORDER:
(wParam == HTTOPLEFT)
?(DWORD) HELPID_SIZING_BORDER:
(wParam == HTTOPRIGHT) ?
(DWORD) HELPID_SIZING_BORDER:
(DWORD) 0L;
if (!((BOOL) dwHelpContextId))
return DefWindowProc(hwnd,
message, wParam, lParam);
bHelp = FALSE;
WinHelp(hWnd, szHelpFileName,
HELP_CONTEXT, dwHelpContextId);
break;
}
return (DefWindowProc(hWnd, message,
wParam, lParam));
If the user
clicks a menu item while in help mode, the application intercepts the WM_COMMAND
case WM_COMMAND:
/* In help mode (Shift-F1)? */
if (bHelp) {
bHelp = FALSE;
WinHelp(hWnd, szHelpFileName,
HELP_CONTEXT, (DWORD)wParam);
return NULL;
}